package gestorvideoclub;

import gestorvideoclub.jdbc.ProveedorJDBC;
import gestorvideoclub.util.introduceDatos;
import java.awt.Stroke;
import java.util.*;import java.util.ArrayList;
;

public class Proveedor {

    private String nombreEmpresa;
    private String CIF;
    private String direccionFiscal;
    private String provincia;
    private String telefono;
    private String cp;
    private String estado;
    private int idProveedor;

    public Proveedor() {
    }

    public Proveedor(String nombreEmpresa, String CIF, String direreccionFiscal, String provincia, String telefono, String cp, String estado) {
        this.nombreEmpresa = nombreEmpresa;
        this.CIF = CIF;
        this.direccionFiscal = direreccionFiscal;
        this.provincia = provincia;
        this.telefono = telefono;
        this.cp = cp;
        this.estado = estado;
    }

    public String getCIF() {
        return CIF;
    }

    public void setCIF(String CIF) {
        this.CIF = CIF;
    }

    public String getCp() {
        return cp;
    }

    public void setCp(String cp) {
        this.cp = cp;
    }

    public String getDireccionFiscal() {
        return direccionFiscal;
    }

    public void setDireccionFiscal(String direccionFiscal) {
        this.direccionFiscal = direccionFiscal;
    }

    public String getEstado() {
        return estado;
    }

    public void setEstado(String estado) {
        this.estado = estado;
    }

    public String getNombreEmpresa() {
        return nombreEmpresa;
    }

    public void setNombreEmpresa(String nombreEmpresa) {
        this.nombreEmpresa = nombreEmpresa;
    }

    public String getProvincia() {
        return provincia;
    }

    public void setProvincia(String provincia) {
        this.provincia = provincia;
    }

    public String getTelefono() {
        return telefono;
    }

    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }

    public int getIdProveedor(){
        return this.idProveedor;
    }

    public void setIdProveedor(int idProveedor){
        this.idProveedor = idProveedor;
    }

    @Override
    public String toString()
    {
        String cad = "Nombre Proveedor: "+this.nombreEmpresa+
                       "\nDirección: "+this.direccionFiscal+" Provincia: "+this.provincia+", CP: "+this.cp+
                       "\nCIF: "+this.CIF+
                       "\nTeléfono: "+this.telefono+
                       "\nEstado: "+this.estado;
        return cad;
    }

    @Override
    public boolean equals(Object o)
    {
        if(o instanceof Proveedor)
        {
            Proveedor p = (Proveedor)o;
            if(this.CIF.equals(p.CIF))
            {
                return true;
            }
        }
        return false;
     }

    @Override
    public int hashCode()
    {
        return 1;
    }


    public void altaProveedor()
    {
        boolean correcto = false;
        String texto = "";
        do{
            System.out.print("Nombre del proveedor: ");
            texto = introduceDatos.introduceString();
            if(texto.length()>0){
                this.setNombreEmpresa(texto);
                correcto = true;
            }
            else{
                System.out.println("[!] El nombre no puede ser vacío");
            }
        }while(!correcto);

        correcto = false;
        do{
            System.out.print("Direccion fiscal: ");
            texto = introduceDatos.introduceString();
            if(texto.length()>0){
                this.setDireccionFiscal(texto);
                correcto = true;
            }
            else{
                System.out.println("[!] La dirección no puede ser vacío");
            }
        }while(!correcto);

        correcto = false;
        do{
            System.out.print("Código Postal: ");
            texto = introduceDatos.introduceString();
            if(texto.length()>0 && texto.length() == 5){
                this.setCp(texto);
                correcto = true;
            }
            else{
                System.out.println("[!] El formato del Código Postal no es correcto, debe tener 5 dígitos");
            }
        }while(!correcto);
            
        correcto = false;
        do{
            System.out.print("Provincia: ");
            texto = introduceDatos.introduceString();
            if(texto.length()>0){
                this.setProvincia(texto);
                correcto = true;
            }
            else{
                System.out.println("[!] La provincia no puede ser vacía");
            }
        }while(!correcto);

        correcto = false;
        do{
            System.out.print("Teléfono: ");
            texto = introduceDatos.introduceString();
            if(texto.length()>0 && texto.length() == 9){
                this.setTelefono(texto);
                correcto = true;
            }
            else{
                System.out.println("[!] El teléfono debe tener 9 dígitos");
            }
        }while(!correcto);

        correcto = false;
        do{
            System.out.print("CIF: ");
            texto = introduceDatos.introduceString();
            if(texto.length()>0){
                this.setCIF(texto);
                correcto = true;
            }
            else{
                System.out.println("[!] El CIF no puede ser vacío");
            }
        }while(!correcto);


        this.setEstado("Alta");
        correcto = false;
        do{
            System.out.println("¿Esta seguro de que desea dar de alta a este proveedor? Seleccione una opcion: ");
            System.out.println("1. Si");
            System.out.println("2. No");
            int op = introduceDatos.introduceEntero();
            switch(op){
                case 1:
                    if(!comprobarProveedor(this)){
                        ProveedorJDBC.altaProveedor(this);
                    }
                    else{
                        System.out.println("El nuevo proveedor ya existe");
                    }

                    correcto = true;
                    break;
                case 2:
                    System.out.println("No se ha guardado el proveedor");
                    correcto = true;
                    break;
                default:
                    System.out.println("Opcion incorrecta");
                    break;
            }

        }while(!correcto);
    }

    public void consultarProveedor()
    {
        System.out.println(this);
    }

    public static void modificarProveedor(Proveedor proveedor){
        boolean salir = false;
        boolean modificado = false;
        System.out.println("Datos actuales: "+proveedor);
        do{
            System.out.println("\nIndique opcion que desea modificar.");
            System.out.println("\n1. Nombre");
            System.out.println("\n2. Direccion Fiscal");
            System.out.println("\n3. Provincia");
            System.out.println("\n4. Codigo Postal");
            System.out.println("\n5. CIF");
            System.out.println("\n6. Telefono");
            System.out.println("\n7. Salir");
            System.out.println("Introduzca el numero de la opcion:");
            int op = introduceDatos.introduceEntero();
            switch(op){
                case 1:
                    System.out.println("\nIntroduzca el nuevo nombre de la empresa: ");
                    String n = introduceDatos.introduceString();
                    proveedor.setNombreEmpresa(n);
                    modificado = true;
                    break;
                case 2:
                    System.out.println("\nIntroduzca la direccion fiscal de la empresa: ");
                    String d = introduceDatos.introduceString();
                    proveedor.setDireccionFiscal(d);
                    modificado = true;
                    break;
                case 3:
                    System.out.println("\nIntroduzca la provincia: ");
                    String p = introduceDatos.introduceString();
                    proveedor.setProvincia(p);
                    modificado = true;
                    break;
                case 4:
                    System.out.println("\nIntroduzca el codigo postal: ");
                    String cPostal = introduceDatos.introduceString();
                    proveedor.setCp(cPostal);
                    modificado = true;
                    break;
                case 5:
                    System.out.println("\nIntroduzca el CIF de la empresa: ");
                    String cif = introduceDatos.introduceString();
                    proveedor.setCIF(cif);
                    modificado = true;
                    break;
                case 6:
                    System.out.println("\nIntroduzca el telefono de la empresa: ");
                    String tel = introduceDatos.introduceString();
                    proveedor.setTelefono(tel);
                    modificado = true;
                    break;
                case 7:
                    salir = true;
                    break;
                default:
                    System.out.println("\n\nOpcion incorrecta");
            }
            if(modificado){
                ProveedorJDBC.modificarProveedor(proveedor);
            }
        }while(!salir);
    }

    public static void modificarEstadoProveedor(Proveedor proveedor)
    {

        System.out.println("¿Está seguro que quiere cambiar el estado a este proveedor?");

        boolean salir = false;
        do{
            System.out.println("1. Si");
            System.out.println("2. No");
            System.out.println("Introduzca el numero correspondiente: ");
            int opcion = introduceDatos.introduceEntero();

            switch(opcion)
            {
                case 1:
                    if(proveedor.getEstado().equalsIgnoreCase("Alta")){
                        proveedor.setEstado("Baja");
                    }
                    else{
                        proveedor.setEstado("Alta");
                    }
                        ProveedorJDBC.modificarProveedor(proveedor);
                        salir = true;
                        break;
                case 2:
                    System.out.println("No se ha modificado el estado.");
                    salir = true;
                    break;
                default:
                    System.out.println("Opcion incorrecta");
            }
        }while(!salir);
    }

    public static void seleccionarTodosProveedores(){
        ArrayList<Proveedor> lista = ProveedorJDBC.consultarProveedores();

        if(lista.size()>0){
            System.out.println("Los proveedores registrados son: \n");

            mostrarProveedoresArray(lista);
            //operacionesProveedor(lista);
        }
        else{
            System.out.println("No existe ningun proveedor");
        }
    }

    public static void buscarProveedor()
    {
        System.out.print("Introduzca el nombre del proveedor: ");
        String nombre = introduceDatos.introduceString();
        ArrayList<Proveedor> lista = ProveedorJDBC.buscarProveedorPorNombre(nombre);
        System.out.println();
        if(lista.size() > 0){
            mostrarProveedoresArray(lista);
            //operacionesProveedor(lista);
        }
        else{
            System.out.println("No existe ningun proveedor con ese nombre");
        }
    }

    public static void operacionesProveedor(ArrayList<Proveedor> lista){
        boolean salir = false;
        do{
            System.out.println("¿Desea realizar alguna operacion? Seleccione una opcion: ");
            System.out.println("1. Si");
            System.out.println("2. No");
            int opcion = introduceDatos.introduceEntero();
            switch(opcion){
                case 1:
                    Proveedor proveedor = seleccionarUnProveedor(lista);
                    operaciones(proveedor);
                    salir = true;
                    break;
                case 2:
                    System.out.println("No se realizara ninguna operacion");
                    salir = true;
                    break;
                default:
                    System.out.println("Opcion incorrecta");
            }
        }while(!salir);
    }

    public static void operaciones(Proveedor proveedor){
        boolean salir = false;
        do{
            System.out.println("Seleccione una de las siguientes opciones: ");
            System.out.println("1. Modificar datos del proveedor");
            System.out.println("2. Modificar estado del proveedor");
            System.out.println("3. Dar de alta un producto ");
            System.out.println("4. Hacer pedido ");
            System.out.println("\nIntroduzca el numero correspondiente a la opcion");
            int opcion = introduceDatos.introduceEntero();

            switch(opcion){
                case 1:
                    modificarProveedor(proveedor);
                    salir = true;
                    break;
                case 2:
                    modificarEstadoProveedor(proveedor);
                    salir = true;
                    break;
                case 3:
                    System.out.println("Dar de alta a un producta");
                    break;
                case 4:
                    
                    break;
                default:
                    System.out.println("Opcion incorrecta");
            }
        }while(!salir);
    }

    public static void mostrarProveedoresArray(ArrayList<Proveedor>lista){

            Iterator it = lista.iterator();
            int i = 1;
            while(it.hasNext()){
                Proveedor proveedor = (Proveedor)it.next();
                System.out.println("Proveedor numero: "+i);
                System.out.println(proveedor);
                i++;
                System.out.println();
            }
    }

    public static Proveedor seleccionarUnProveedor(ArrayList lista){
        mostrarProveedoresArray(lista);
        
        boolean salir = false;
        Proveedor proveedor = null;

        do{
           System.out.println("Seleccione el numero del proveedor: ");
           int opcion = introduceDatos.introduceEntero();
           if( (opcion > 0) && (opcion <= lista.size()+1) ){
                proveedor = (Proveedor)lista.get(opcion-1);
                salir = true;
           }
           else{
                System.out.println("Opcion incorrecta");
           }

        }while(!salir);
        
        return proveedor;
    }

    public static boolean comprobarProveedor(Proveedor proveedor){
        boolean result = false;
        int num = ProveedorJDBC.existeProveedor(proveedor.getCIF());
        if(num > 0){
            result = true;
        }
        return result;
    }
}

